home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / examples / ip2if.rexx < prev    next >
OS/2 REXX Batch file  |  2000-11-28  |  3KB  |  109 lines

  1. /* route example: shows the name of the interface used for an address */
  2.  
  3. l="rmh.library";if ~show("L",l) then;if ~addlib(l,0,-30) then exit
  4. if AddLibrary("rexxsupport.library","rxsocket.library","rxlibnet.library")~=0 then exit
  5.  
  6. prg=ProgramName("NOEXT")
  7.  
  8. if ~IsLibOn("SOCKET") then do
  9.     say "No tcp/ip stack is running."
  10.     say "Remember: this macro works ONLY with Miami."
  11.     exit
  12. end
  13.  
  14. if ~IsLibOn("MIAMI") then do
  15.     say "This macro works ONLY with Miami."
  16.     exit
  17. end
  18.  
  19. if ~open("STDERR","CONSOLE:","W") then stderr="STDOUT"
  20. if ~RMH_ReadArgs("ADDRESS/A") then do
  21.     call PrintFault()
  22.     exit
  23. end
  24.  
  25. addr=resolve(parm.0.value)
  26. if addr=-1 then call err "can't resolve <"parm.0.value">",1
  27.  
  28. s=socket("ROUTE","RAW")
  29. if s<0 then call err "no socket"
  30.  
  31. len  = 92+16
  32. type = char(4)
  33. pid  = MiamiGetPid()
  34. seq  = long(1)
  35.  
  36. rtm = short(len)                    /* u_short    rtm_msglen             */
  37. rtm = rtm || char(4)                /* u_char    rtm_version;        */
  38. rtm = rtm || type                    /* u_char    rtm_type;            */
  39. rtm = rtm || short(0)               /* u_short    rtm_index            */
  40. rtm = rtm || short(0)               /* u_short     rtm_pad1;            */
  41. rtm = rtm || long(0)                /* long     rtm_flags;            */
  42. rtm = rtm || long(or(1,16))         /* long     rtm_addrs            */
  43. rtm = rtm || pid                    /* void         *rtm_pid            */
  44. rtm = rtm || seq                      /* long     rtm_seq                */
  45. rtm = rtm || long(0)                /* long     rtm_errno            */
  46. rtm = rtm || long(0)                /* long     rtm_use                */
  47. rtm = rtm || long(0)                /* u_long    rtm_inits            */
  48. rtm = rtm || nul(56)                /* struct    rt_metrics rtm_rmx    */
  49.  
  50. sin = char(16)                        /* u_char     sin_len                */
  51. sin = sin || char(2)                /* u_char      sin_family            */
  52. sin = sin || short(0)                  /* u_short     sin_port            */
  53. sin = sin || pad(addr2c(addr),4)    /* struct      in_addr sin_addr     */
  54. sin = sin || nul(8)                 /* char           sin_zero[8]            */
  55.  
  56. rtm = rtm || sin
  57.  
  58. if send(s,rtm,len)<0 then do
  59.     if Errno()~=3 then call err "send error"
  60.     say "<"addr"> is unreacheble"
  61.     exit
  62. end
  63.  
  64. do until res<=0 | (t=type & se=seq & p=pid)
  65.     res = recv(s,"RTM",1024)
  66.     if res>0 then
  67.         parse var rtm d +2 d +1 t +1 index +2 d +2 d +4 d +4 p +4 se +4 rest
  68. end
  69. if res<0 then call err "recv error"
  70.  
  71. if=MiamiIFIndexToName(c2d(index))
  72. if if="" then do
  73.     say "<"addr"> is unreacheble"
  74.     exit
  75. end
  76. if ~Datatype(right(if,1),"N") then if=if"0"
  77. sd=socket("INET","DGRAM")
  78. if s<0 then call err "socket error"
  79.  
  80. if IoctlSocket(sd,"SIOCGIFADDR",if,"IFADDR")<0 then call err "ioctl error"
  81. say "<"addr"> -> '"if"' ["IFAddr"]"
  82. exit
  83.  
  84. err: procedure expose prg stderr
  85. parse arg msg,ntdoerr
  86.     if ntdoerr~=1 then msg = msg "("ErrorString()")"
  87.     call writeln(stderr,prg":" msg)
  88.     exit
  89.  
  90. pad: procedure
  91. parse arg c,i
  92.     return right(copies("00"x,i)||c,i)
  93.  
  94. char: procedure
  95. parse arg i
  96.     return d2c(i)
  97.  
  98. short: procedure
  99. parse arg i
  100.     return right("0000"x||d2c(i),2)
  101.  
  102. long: procedure
  103. parse arg i
  104.     return right("00000000"x||d2c(i),4)
  105.  
  106. nul: procedure
  107. parse arg i
  108.     return copies("00"x,i)
  109.